package com.ocom.nettyxf;


import com.ocom.common.utils.NumConvertUtil;
import com.ocom.nettyxf.service.JNASM2Dll;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.UnsupportedEncodingException;

@SpringBootTest
public class Sm2 {

    @Test
    public  void main3() throws UnsupportedEncodingException {

        System.out.println( "05012107505320230515163644000400000001001330313030353035393830343439373932333734".substring(4,30));
        System.out.println( hexStringToString("5665723a362e322e3530"));

        String  rd = NumConvertUtil.toGBK("提示解析异常");

        System.out.println(rd);

        byte[] gbkText = {(byte) 0x0a,(byte) 0xbf,(byte) 0xa8
                ,(byte) 0xd7
                ,(byte) 0xb4
                ,(byte) 0xcc
                ,(byte) 0xac
                ,(byte) 0xd2
                ,(byte) 0xec
                ,(byte) 0xb3
                ,(byte) 0xa3};
        String testStr = new String(gbkText,"GBK");
        System.out.println(testStr);
        byte[] gbkText2 = {
                (byte) 0xcc
                ,(byte) 0xe1
                ,(byte) 0xca
                ,(byte) 0xbe
                ,(byte) 0xbd
                ,(byte) 0xe2
                ,(byte) 0xce
                ,(byte) 0xf6
                ,(byte) 0xd2
                ,(byte) 0xec
                ,(byte) 0xb3
                ,(byte) 0xa3};
        String testStr2 = new String(gbkText2,"GBK");
        System.out.println(testStr2);

        String testStr3 = new String(NumConvertUtil.hexStringToByte("cd6a7b8b6bde1b9fbceb4d6aa"),"GBK");
        System.out.println(testStr3);
        String testStr4 = new String(NumConvertUtil.hexStringToByte("080208d6d8b8b4b6a9b5a5"),"GBK");
        System.out.println(testStr4);
        String testStr5 = new String(NumConvertUtil.hexStringToByte("596f7572206368616e6e656c206973206275696c64200d0a"),"GBK");
        System.out.println(testStr5);

        //Your channel is build

    }

    /**
     * 16进制转换成为string类型字符串
     * @param s
     * @return
     */
    public static String hexStringToString(String s) {
        if (s == null || s.equals("")) {
            return null;
        }
        s = s.replace(" ", "");
        byte[] baKeyword = new byte[s.length() / 2];
        for (int i = 0; i < baKeyword.length; i++) {
            try {
                baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        try {
            s = new String(baKeyword, "UTF-8");
            new String();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return s;
    }

    @Test
    public  void main5(){
        System.out.println(JNASM2Dll.instanceDll.add(1,2));

        try {

//            System.out.println(JNASM2Dll.instanceDll.sm2_verify(
//                    "4BECFA44FE4C9819F784B7DF7216288A6DB33F947C10B3413BAF3A12330F99DB",
//                    "EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70",
//                    "33563489094A0506C237A4965395D61B",
//                    "EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70"
//            ));

//            System.out.println(JNASM2Dll.instanceDll.sm2_verify(
//                    NumConvertUtil.hexStringToByte("4BECFA44FE4C9819F784B7DF7216288A6DB33F947C10B3413BAF3A12330F99DB"),
//                            NumConvertUtil.hexStringToByte(  "EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70"),
//                                    NumConvertUtil.hexStringToByte( "33563489094A0506C237A4965395D61B"),
//                                            NumConvertUtil.hexStringToByte(  "EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70EAC5FC31FD67D30224FF8F8918B00936F5392E1BB6C3653C69272A7111AF5B70")
//            ));

//            String input = "1234";
//            String md5s = MD5.MD5Encode(input,"utf8");
//            System.out.println(md5s);
//            System.out.println(NumConvertUtil.toGBK(md5s));
//

//            byte[] b = NumConvertUtil.hexStringToByte("EBAB7A0EEC89A627CF21595EAC64295307CC28CF02F3B284C8707A0638F4D609");
//            char[] c = new char[b.length];
//            for (int i = 0; i< b.length; i++) {
//                c[i] = (char) (b[i] & 0xff);
//            }
//
//            byte[] e = NumConvertUtil.hexStringToByte("3333353633343839303934413035303643323337413439363533393544363142");
//            char[] d = new char[e.length];
//            for (int i = 0; i< e.length; i++) {
//                d[i] = (char) (e[i] & 0xff);
//            }
//
//            char[] gr = new char[64];
//            System.out.println(JNASM2Dll.instanceDll.sm2_sign(
//                    c ,
//                    d,
//                    gr
//            ));
//            System.out.println(gr);


            String gr = "";
            System.out.println(JNASM2Dll.instanceDll.sm2_sign(
                   "EBAB7A0EEC89A627CF21595EAC64295307CC28CF02F3B284C8707A0638F4D609",
                   "3333353633343839303934413035303643323337413439363533393544363142",
                    gr
            ));
            System.out.println(gr);

        }catch (Exception e){
            System.out.println(e.getMessage());
        }

    }

//    /**
//     * 签名
//     * @param userId
//     * @param privateKey
//     * @param sourceData
//     * @return
//     * @throws IOException
//     */
//    public static byte[] sign(byte[] userId, byte[] privateKey, byte[] sourceData) throws IOException {
//        if (privateKey != null && privateKey.length != 0) {
//            if (sourceData != null && sourceData.length != 0) {
//                SM2 sm2 = SM2.Instance();
//                BigInteger userD = new BigInteger(privateKey);
//                ECPoint userKey = sm2.ecc_point_g.multiply(userD);
//                byte[] z = sm2.sm2GetZ(userId, userKey);
//                SM3Digest sm3 = new SM3Digest();
//                sm3.update(z, 0, z.length);
//                sm3.update(sourceData, 0, sourceData.length);
//                byte[] md = new byte[32];
//                sm3.doFinal(md, 0);
//                SM2Result sm2Result = new SM2Result();
//                sm2.sm2Sign(md, userD, userKey, sm2Result);
//                DERInteger d_r = new DERInteger(sm2Result.r);
//                DERInteger d_s = new DERInteger(sm2Result.s);
//                ASN1EncodableVector v2 = new ASN1EncodableVector();
//                v2.add(d_r);
//                v2.add(d_s);
//                DERSequence sign = new DERSequence(v2);
//                byte[] signdata = sign.getEncoded();
//                return signdata;
//            } else {
//                return null;
//            }
//        } else {
//            return null;
//        }
//    }
//
//    /**
//     * 验签
//     * @param userId
//     * @param publicKey
//     * @param sourceData
//     * @param signData
//     * @return
//     * @throws IOException
//     */
//    public static boolean verifySign(byte[] userId, byte[] publicKey, byte[] sourceData, byte[] signData) throws IOException {
//        if (publicKey != null && publicKey.length != 0) {
//            if (sourceData != null && sourceData.length != 0) {
//                SM2 sm2 = SM2.Instance();
//                ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);
//                SM3Digest sm3 = new SM3Digest();
//                byte[] z = sm2.sm2GetZ(userId, userKey);
//                sm3.update(z, 0, z.length);
//                sm3.update(sourceData, 0, sourceData.length);
//                byte[] md = new byte[32];
//                sm3.doFinal(md, 0);
//                ByteArrayInputStream bis = new ByteArrayInputStream(signData);
//                ASN1InputStream dis = new ASN1InputStream(bis);
//                ASN1Primitive derObj = dis.readObject();
//                Enumeration<ASN1Integer> e = ((ASN1Sequence)derObj).getObjects();
//                BigInteger r = ((ASN1Integer)e.nextElement()).getValue();
//                BigInteger s = ((ASN1Integer)e.nextElement()).getValue();
//                SM2Result sm2Result = new SM2Result();
//                sm2Result.r = r;
//                sm2Result.s = s;
//                sm2.sm2Verify(md, userKey, sm2Result.r, sm2Result.s, sm2Result);
//                return sm2Result.r.equals(sm2Result.R);
//            } else {
//                return false;
//            }
//        } else {
//            return false;
//        }
//    }


    @Test
    void contextLoads() {
        String  tyy= "DK21105384202210021800583052";
    }




}
